package algorithm.middle;

import sun.security.util.Length;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: 几张卡牌 排成一行，每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
 *
 * 每次行动，你可以从行的开头或者末尾拿一张卡牌，最终你必须正好拿 k 张卡牌。
 *
 * 你的点数就是你拿到手中的所有卡牌的点数之和。
 *
 * 给你一个整数数组 cardPoints 和整数 k，请你返回可以获得的最大点数。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @Author: 江岸
 * @CreateTime: 2021-02-06 22:45
 * @Description: 可获得的最大点数
 */
public class MaxScore1423 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,1};
        System.out.println(maxScore(arr,3));
    }
    //思路转换为求 lengh-k 长度的最小子串和 滑动窗口
    public static int maxScore(int[] cardPoints, int k) {
        //总数
        int sum = 0;
        for (int x:cardPoints){
            sum+=x;
        }
        if (k==cardPoints.length){
            return sum;
        }
        int lengh = cardPoints.length - k;
        //前lengh个字串
        int count = 0;
        for (int i=0;i< lengh;i++){
            count+=cardPoints[i];
        }
        //求最小字串
        int min = count;
        for (int i=lengh;i<cardPoints.length;i++){
            count = count + cardPoints[i] - cardPoints[i-lengh];
            min = Math.min(min,count);
        }
        return sum-min;
    }

}
